#include "BlockQueue.hpp"
#include "Task.hpp"
#include <iostream>
#include <pthread.h>
#include <unistd.h>

void* consumer(void *args)
{
    BlockQueue<task_t>*bq=static_cast<BlockQueue<task_t>*>(args);
    while(true)
    {
        //1.消费任务
        task_t t=bq->Pop();//临界区

        //2.处理任务，真正高效的!!
        t();//非临界区
    }
}

void* productor(void *args)
{
    BlockQueue<task_t>*bq=static_cast<BlockQueue<task_t>*>(args);
    while(true)
    {
        //1.构造任务，真正高效的
        std::cout<<"生产了一个任务："<<std::endl;//临界区

        //2.生产任务
        bq->Equeue(Download);
    }
}

int main()
{
    BlockQueue<task_t> *bq = new BlockQueue<task_t>();

    // 构建生产和消费者
    pthread_t c[2], p[3];

    pthread_create(c, nullptr, consumer, bq);
    pthread_create(c + 1, nullptr, consumer, bq);
    pthread_create(p, nullptr, productor, bq);
    pthread_create(p + 1, nullptr, productor, bq);
    pthread_create(p + 2, nullptr, productor, bq);

    pthread_join(c[0], nullptr);
    pthread_join(c[1], nullptr);
    pthread_join(p[0], nullptr);
    pthread_join(p[1], nullptr);
    pthread_join(p[2], nullptr);

    return 0;
}